package ym.ecrm.core.dao.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 数据操作基类接口
 * 
 * @author Princess
 * @version 1.0
 */
public interface IEntityDAO<T> {
	/**
	 * 相当于使用HibernateTemplate.load(id)
	 * 
	 * @param id
	 *            主键id
	 * @return
	 */
	T load(Serializable id);

	/**
	 * 相当于使用HibernateTemplate.get(id)
	 * 
	 * @param id
	 *            主键id
	 * @return
	 */
	T get(Serializable id);

	/**
	 * 相当地使用HibernateTemplate.loadAll()
	 * 
	 * @return List<T> 读取所有的对象
	 */
	List<T> loadAll();

	/**
	 * 保存实体entity,entity须为持久化状态或胶管状态
	 * 即entity须先使用get(),load(),find(),sava(),saveOrUpdate()等方法
	 * 得到相应的持久化状态或胶管状态在对象， 注：持久化状态或胶管状态为 Hibernate中生命周期中的状态
	 * 
	 * @param entity
	 *            保存的实体
	 */
	void save(T entity);

	/**
	 * 更新实体entity,entity须为持久化状态或胶管状态
	 * 即entity须先使用get(),load(),find(),sava(),saveOrUpdate()等方法
	 * 得到相应的持久化状态或胶管状态在对象， 注：持久化状态或胶管状态为 Hibernate中生命周期中的状态
	 * 
	 * @param entity
	 *            更新的实体
	 */
	void update(T entity);

	/**
	 * 更新集合中的实体
	 * 
	 * @param entities
	 */
	void update(Collection<T> entities);

	/**
	 * 能过Id删除实体，实体不用为持久化状态或胶管状态 该实体必须是继续ym.ecrm.core.domain.base.BaseEntity
	 * 或实体主键的变量名为id
	 * 
	 * @param id
	 *            对象的id
	 */
	void delete(Serializable id);

	/**
	 * 删除实体entity,entity须为持久化状态或胶管状态
	 * 即entity须先使用get(),load(),find(),sava(),saveOrUpdate()等方法
	 * 得到相应的持久化状态或胶管状态在对象， 注：持久化状态或胶管状态为 Hibernate中生命周期中的状态
	 * 
	 * @param entity
	 *            删除的对象
	 */
	void delete(T entity);

	/**
	 * 删除所有实体
	 */
	void deleteAll();

	/**
	 * 删除集合中的实体
	 * 
	 * @param entities
	 */
	void delete(Collection<T> entities);

	/**
	 * 执行hql语句返回的是List
	 * 
	 * @param hql
	 *            hql语句
	 * @return List
	 */
	List find(String hql);

	/**
	 * 执行hql语句，可传入变量。 hql中包含？号变量，parames为Object[]对应每个变量的值
	 * 
	 * @param hql
	 * @param params
	 * @return
	 */
	List find(String hql, Object... params);

	/**
	 * 可指定实体中成员属性的值，来查询实体 例如：查询实体中name属性为"admin"的实体，可能过下面语句查询
	 * findBy("name","admin") 返回符合条件的List<T>
	 * 
	 * @param propertyName
	 *            成员属性名
	 * @param value
	 *            属性值
	 * @return List<T>
	 */
	List<T> findBy(String propertyName, Object value);

	/**
	 * 可指定实体中成员属性的值、按哪个属性排序、是升序还是降序，来查询实体
	 * 
	 * @param propertyName
	 *            成员属性名
	 * @param value
	 *            属性值
	 * @param orderBy
	 * @param isAsc
	 *            true为升序，false为降序
	 * @return
	 */
	List<T> findBy(String propertyName, Object value, String orderBy,
			boolean isAsc);

	/**
	 * 模糊查询 可指定实体中成员属性的值，模糊查询实体
	 * 
	 * @param propertyName
	 *            成员属性名
	 * @param value
	 * @return List<T>
	 */
	List<T> fuzzyQuery(String propertyName, Object value);

	/**
	 * 排序模糊查询 可指定实体中成员属性的值、按哪个属性排序、是升序还是降序，模糊查询实体
	 * 
	 * @param propertyName
	 *            成员属性名
	 * @param value
	 *            属性值
	 * @param orderBy
	 *            排序的属性名
	 * @param isAsc
	 *            true为升序，false为降序
	 * @return List<T>
	 */
	List<T> fuzzyQuery(String propertyName, Object value, String orderBy,
			boolean isAsc);

	/**
	 * 按属性名查询返回符合条件的第一个实体，若没有，则返回null
	 * 
	 * @param propertyName
	 *            成员属性名
	 * @param value
	 *            属性值
	 * @return T
	 */
	T findUniqueBy(String propertyName, Object value);

	void flush();
}
